home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / fioben.zip / CAT5.CPP < prev    next >
C/C++ Source or Header  |  1993-02-09  |  6KB  |  219 lines

  1. #include    <windows.h>
  2. #include    <iostream.h>
  3. #include    <iomanip.h>
  4. #include    <fstream.h>
  5. #include    <string.h>
  6.  
  7. ofstream    CERR("results.out", ios::app);
  8. int    BUFLEN = 0x10000;
  9.  
  10. ostream    & operator << (ostream & os, SYSTEMTIME & r)
  11. {
  12.     static    const char    * const rgszDayNames[] =
  13.         {
  14.         "Sunday",
  15.         "Monday",
  16.         "Tuesday",
  17.         "Wednesday",
  18.         "Thursday",
  19.         "Friday",
  20.         "Saturday",
  21.         0
  22.         };
  23.     char    chFill = os.fill();
  24.     os.fill('0');
  25.     os //--------------------------------- << rgszDayNames[r.wDayOfWeek] << ' '
  26.         << setw(2) << r.wMonth << '/'
  27.         << setw(2) << r.wDay << '/'
  28.         << setw(2) << r.wYear << ' '
  29.         << setw(2) << r.wHour << ':'
  30.         << setw(2) << r.wMinute << ':'
  31.         //------------------- << setw(2) << r.wSecond
  32.         ;
  33.     os.fill(chFill);
  34.     return    os;
  35. }
  36.  
  37. //****************************************************************
  38. void    cat2(HANDLE h, HANDLE hOut)
  39. {
  40.     HANDLE    hOutMap = 0;
  41.     LPVOID    pOut = 0;
  42.     DWORD    dwMapFirst = 0;
  43.     DWORD    dwMapOffset = 0;
  44.     DWORD    dwOutSize = 0;
  45.     //----------------------------------------------------------------
  46.     HANDLE    hMap = CreateFileMapping(h, 0, PAGE_READONLY, 0,0, 0);
  47.     if (0 == hMap)
  48.         {
  49.         CERR << GetLastError() << ": error in CreateFileMapping."
  50.             << "Line " << __LINE__ << ", file " << __FILE__
  51.             << endl;
  52.         return;
  53.         }
  54.     LPVOID    pView = MapViewOfFile(hMap, FILE_MAP_READ, 0,0, 0);
  55.     if (0 == pView)
  56.         {
  57.         CERR << GetLastError() << ": error in MapViewOfFile()."
  58.             << "Line " << __LINE__ << ", file " << __FILE__
  59.             << endl;
  60.         CloseHandle(hMap);
  61.         return;
  62.         }
  63.     DWORD    dwFileSizeHigh, dwFileSizeLo = GetFileSize(h, &dwFileSizeHigh);
  64.     //----------------------------------------------------------------
  65.     DWORD    dwHere = SetFilePointer(hOut, 0, 0, FILE_END);
  66.     if ((DWORD)-1 == dwHere)
  67.         {
  68.         CERR << GetLastError() << ": error getting file pos."
  69.             << "Line " << __LINE__ << ", file " << __FILE__
  70.             << endl;
  71.         goto Cleanup;
  72.         }
  73.     dwOutSize = SetFilePointer(hOut, dwFileSizeLo, 0, FILE_CURRENT);
  74.     if ((DWORD)-1 == dwOutSize)
  75.         {
  76.         CERR << GetLastError() << ": error extending file end."
  77.             << "Line " << __LINE__ << ", file " << __FILE__
  78.             << endl;
  79.         goto Cleanup;
  80.         }
  81.     if (!SetEndOfFile(hOut) )
  82.         {
  83.         CERR << GetLastError() << ": error setting new end of file."
  84.             << "Line " << __LINE__ << ", file " << __FILE__
  85.             << endl;
  86.         goto Cleanup;
  87.         }
  88.     //----------------------------------------------------------------
  89.     dwMapFirst = dwHere & ~(0xffff);
  90.     dwMapOffset = dwHere - dwMapFirst;
  91.  
  92.     hOutMap = CreateFileMapping(hOut, 0, PAGE_READWRITE,
  93.                         0, dwOutSize, 0);
  94.     if (0 == hOutMap)
  95.         {
  96.         CERR << GetLastError() << ": error mapping output file."
  97.             << "Line " << __LINE__ << ", file " << __FILE__
  98.             << endl;
  99.         }
  100.     pOut = MapViewOfFile(hOutMap, FILE_MAP_WRITE, 0, dwMapFirst,
  101.         dwFileSizeLo + dwMapOffset);
  102.     if (0 == pOut)
  103.         {
  104.         CERR << GetLastError() << ": error mapping view of output."
  105.             << "Line " << __LINE__ << ", file " << __FILE__
  106.             << endl;
  107.         goto CleanupWrite;
  108.         }
  109.     if (!WriteProcessMemory(GetCurrentProcess(),
  110.         (void *)((char *)pOut + dwMapOffset),
  111.         pView, dwFileSizeLo, 0) )
  112.         {
  113.         CERR << GetLastError() << ": error in WriteProcessMemory()."
  114.             << "Line " << __LINE__ << ", file " << __FILE__
  115.             << endl;
  116.         }
  117.     if (!UnmapViewOfFile(pOut) )
  118.         {
  119.         CERR << GetLastError() << ": error unmapping output."
  120.             << "Line " << __LINE__ << ", file " << __FILE__
  121.             << endl;
  122.         }
  123.     //----------------------------------------------------------------
  124. CleanupWrite:
  125.     CloseHandle(hOutMap);
  126. Cleanup:
  127.     UnmapViewOfFile(pView);
  128.     CloseHandle(hMap);
  129. }
  130. //****************************************************************
  131. void cat(HANDLE h, HANDLE hOut)
  132. {
  133.     char    szBuf[8192];
  134.     DWORD    nBytes;
  135.     while (ReadFile(h, szBuf, sizeof(szBuf), &nBytes, 0) && nBytes)
  136.         {
  137.         DWORD    nWritten;
  138.         if (!WriteFile(hOut, szBuf, nBytes, &nWritten, 0) )
  139.             {
  140.             CERR << GetLastError() << ": error in WriteFile. "
  141.                 << nBytes << " read, " << nWritten << " written."
  142.                 << "Line " << __LINE__ << ", file " << __FILE__
  143.                 << endl;
  144.             // return;
  145.             }
  146.         }
  147. }
  148. //****************************************************************
  149. int main(int argc, char **argv)
  150. {
  151.     if (argc < 2)
  152.         {
  153.         cat(GetStdHandle(STD_INPUT_HANDLE), GetStdHandle(STD_OUTPUT_HANDLE));
  154.         return    0;
  155.         }
  156.     //----------------------------------------------------------------
  157.     SYSTEMTIME    sNow;
  158.     GetLocalTime(&sNow);
  159.     CERR << sNow << "===> " << GetCommandLine() << endl;
  160.     //----------------------------------------------------------------
  161.     HANDLE    hStdout = CreateFile("testme.out",
  162.         GENERIC_READ | GENERIC_WRITE,
  163.         0,
  164.         0,
  165.         CREATE_ALWAYS,
  166.         0,
  167.         0);
  168.     if (INVALID_HANDLE_VALUE == hStdout)
  169.         {
  170.         CERR << GetLastError() << ": error opening testme.out for writing."
  171.             << "Line " << __LINE__ << ", file " << __FILE__
  172.             << endl;
  173.         return    4;
  174.         }
  175.     if (FILE_TYPE_DISK != GetFileType(hStdout) )
  176.         {
  177.         CERR << "Can't use " << argv[0] << " for console i/o."
  178.             << "Line " << __LINE__ << ", file " << __FILE__
  179.             << endl;
  180.         return    2;
  181.         }
  182.     if ((DWORD) -1 == SetFilePointer(hStdout, 0, 0, FILE_BEGIN) )
  183.         {
  184.         CERR << GetLastError() << ": error seeking to beginning of output."
  185.             << endl;
  186.         return    4;
  187.         }
  188.     if (!SetEndOfFile(hStdout))
  189.         {
  190.         CERR    << GetLastError() << ": error truncating output file."
  191.             << endl;
  192.         return    4;
  193.         }
  194.     //----------------------------------------------------------------
  195.     DWORD    dwStart = GetTickCount();
  196.     for (int iArg = 1; iArg < argc; iArg++)
  197.         {
  198.         HANDLE    fp = CreateFile(argv[iArg], GENERIC_READ,
  199.             FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
  200.             OPEN_EXISTING, 0, 0);
  201.         if (INVALID_HANDLE_VALUE == fp)
  202.             {
  203.             CERR << GetLastError() << ": error opening file "
  204.                 << argv[iArg] << " for reading." << endl;
  205.             continue;
  206.             }
  207.  
  208.         cat2(fp, hStdout);
  209.         CloseHandle(fp);
  210.         }
  211.     dwStart = GetTickCount( ) - dwStart;
  212.      CERR << "**** Total time: " << (dwStart / 1000)
  213.         << '.' << (dwStart % 1000) << " seconds."
  214.         << endl;
  215.     return    0;
  216. }
  217.  
  218.  
  219.